From 49c7cf36e4e642198c6219a433e81da990da6d99 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Timm=20B=C3=A4der?= Date: Sat, 9 Dec 2017 09:41:52 +0100 Subject: [PATCH] gl renderer: Fix inset and outset shadows in hidpi --- gsk/gl/gskglrenderer.c | 67 +++++++++++++++++++++++------------------- 1 file changed, 37 insertions(+), 30 deletions(-) diff --git a/gsk/gl/gskglrenderer.c b/gsk/gl/gskglrenderer.c index 42c8ce839f..f2a3fee1fd 100644 --- a/gsk/gl/gskglrenderer.c +++ b/gsk/gl/gskglrenderer.c @@ -91,26 +91,6 @@ get_gl_scaling_filters (GskRenderNode *node, *mag_filter_r = GL_LINEAR; } -static inline void -rounded_rect_to_floats (const GskRoundedRect *rect, - float *outline, - float *corner_widths, - float *corner_heights) -{ - int i; - - outline[0] = rect->bounds.origin.x; - outline[1] = rect->bounds.origin.y; - outline[2] = rect->bounds.size.width; - outline[3] = rect->bounds.size.height; - - for (i = 0; i < 4; i ++) - { - corner_widths[i] = rect->corner[i].width; - corner_heights[i] = rect->corner[i].height; - } -} - static inline void rgba_to_float (const GdkRGBA *c, float *f) @@ -271,6 +251,31 @@ rounded_rect_intersect (GskGLRenderer *self, } } +static inline void +rounded_rect_to_floats (GskGLRenderer *self, + RenderOpBuilder *builder, + const GskRoundedRect *rect, + float *outline, + float *corner_widths, + float *corner_heights) +{ + int i; + graphene_rect_t transformed_bounds; + + graphene_matrix_transform_bounds (&builder->current_modelview, &rect->bounds, &transformed_bounds); + + outline[0] = transformed_bounds.origin.x; + outline[1] = transformed_bounds.origin.y; + outline[2] = transformed_bounds.size.width; + outline[3] = transformed_bounds.size.height; + + for (i = 0; i < 4; i ++) + { + corner_widths[i] = rect->corner[i].width * self->scale_factor; + corner_heights[i] = rect->corner[i].height * self->scale_factor; + } +} + static inline void render_fallback_node (GskGLRenderer *self, GskRenderNode *node, @@ -835,14 +840,15 @@ render_inset_shadow_node (GskGLRenderer *self, op.op = OP_CHANGE_INSET_SHADOW; rgba_to_float (gsk_inset_shadow_node_peek_color (node), op.inset_shadow.color); - rounded_rect_to_floats (gsk_inset_shadow_node_peek_outline (node), + rounded_rect_to_floats (self, builder, + gsk_inset_shadow_node_peek_outline (node), op.inset_shadow.outline, op.inset_shadow.corner_widths, op.inset_shadow.corner_heights); - op.inset_shadow.radius = gsk_inset_shadow_node_get_blur_radius (node); - op.inset_shadow.spread = gsk_inset_shadow_node_get_spread (node); - op.inset_shadow.offset[0] = gsk_inset_shadow_node_get_dx (node); - op.inset_shadow.offset[1] = -gsk_inset_shadow_node_get_dy (node); + op.inset_shadow.radius = gsk_inset_shadow_node_get_blur_radius (node) * self->scale_factor; + op.inset_shadow.spread = gsk_inset_shadow_node_get_spread (node) * self->scale_factor; + op.inset_shadow.offset[0] = gsk_inset_shadow_node_get_dx (node) * self->scale_factor; + op.inset_shadow.offset[1] = -gsk_inset_shadow_node_get_dy (node) * self->scale_factor; ops_set_program (builder, &self->inset_shadow_program); ops_add (builder, &op); @@ -866,14 +872,15 @@ render_outset_shadow_node (GskGLRenderer *self, op.op = OP_CHANGE_OUTSET_SHADOW; rgba_to_float (gsk_outset_shadow_node_peek_color (node), op.outset_shadow.color); - rounded_rect_to_floats (gsk_outset_shadow_node_peek_outline (node), + rounded_rect_to_floats (self, builder, + gsk_outset_shadow_node_peek_outline (node), op.outset_shadow.outline, op.outset_shadow.corner_widths, op.outset_shadow.corner_heights); - op.outset_shadow.radius = gsk_outset_shadow_node_get_blur_radius (node); - op.outset_shadow.spread = gsk_outset_shadow_node_get_spread (node); - op.outset_shadow.offset[0] = gsk_outset_shadow_node_get_dx (node); - op.outset_shadow.offset[1] = -gsk_outset_shadow_node_get_dy (node); + op.outset_shadow.radius = gsk_outset_shadow_node_get_blur_radius (node) * self->scale_factor; + op.outset_shadow.spread = gsk_outset_shadow_node_get_spread (node) * self->scale_factor; + op.outset_shadow.offset[0] = gsk_outset_shadow_node_get_dx (node) * self->scale_factor; + op.outset_shadow.offset[1] = -gsk_outset_shadow_node_get_dy (node) * self->scale_factor; ops_set_program (builder, &self->outset_shadow_program); ops_add (builder, &op); -- 2.30.2